package com.example.gateway.designPattern.simpleFactory;


import com.example.gateway.designPattern.simpleFactory.cgc.AbstractFactory;
import com.example.gateway.designPattern.simpleFactory.cgc.FactoryProducer;
import com.example.gateway.designPattern.simpleFactory.gcfs.BjPizzaFactory;
import com.example.gateway.designPattern.simpleFactory.gcfs.LdPizzaFactory;
import com.example.gateway.designPattern.simpleFactory.jdgc.PizzaFactory;

/**
 * @ClassName: Client
 * @Description:
 * @Author: YourName
 * @Date: 2024/12/31
 */

public class Client {

    public static void main(String[] args) {
        /*
         * 简单工厂模式 （静态工厂）
         *  优点：
         *     1. 客户端只需要知道具体的产品名称即可，不需要知道具体的产品类，降低了客户端与具体产品的耦合度。
         *     2. 简化了客户端的代码，不需要在客户端中创建具体的产品对象，只需要调用工厂方法即可。
         *     3. 工厂类集中了所有产品的创建逻辑，使得代码更加清晰和易于维护。
         *
         *   缺点：
         *     1. 工厂类集中了所有产品的创建逻辑，如果产品种类较多，工厂类的代码会变得非常庞大和复杂。
         *     2. 工厂类职责过重，一旦需要添加新的产品，就需要修改工厂类的代码，违反了开闭原则。
         *     3. 工厂类无法扩展，如果需要扩展新的功能，需要修改工厂类的代码，违反了单一职责原则。
         */

        Pizza pizza;
        pizza = PizzaFactory.createPizza("cheese");

        //工厂方法 获取产品实力的方法  进行抽象 ，让其子类完成  不同类型的子类工厂可创建 可对应不同类型的产品
        BjPizzaFactory factory = new BjPizzaFactory();
        pizza = factory.createPizza("cheese");

        LdPizzaFactory ldPizzaFactory = new LdPizzaFactory();
        pizza = ldPizzaFactory.createPizza("cheese");

        //抽象工厂方法  提供一个创建一系列相关或相互依赖对象的接口，而无需指定它们的具体类。
        AbstractFactory sbsFactory = FactoryProducer.getFactory("ld");
        Pizza cheese = sbsFactory.getBjPizza("cheese");
        Pizza cheese1 = sbsFactory.getLdPizza("cheese");


    }
}
